var app = getApp();
var encode = require("./encoding.js");
var jpPrinter = {　　　　
  createNew: function() {　　　　　　
    var jpPrinter = {};
    var data = "";
    var command = []

    jpPrinter.name = "蓝牙打印机";

    jpPrinter.init = function() {};

    jpPrinter.addCommand = function(content) { //将指令转成数组装起
      var code = new encode.TextEncoder(
        'gb18030', {
          NONSTANDARD_allowLegacyEncoding: true
        }).encode(content)
      for (var i = 0; i < code.length; ++i) {
        command.push(code[i])
      }
    };
     /**
     * 标签初始化指令
     * offset：标签横向偏移量
     * height：标签最大高度
     * qty：标签数量
     */
    jpPrinter.Initial = function(offset,height,qty) {
      data = "! " + offset + " 200 " + "200 " + height + " " + qty + "\r\n";
      jpPrinter.addCommand(data)
    };
    /**
     * 该指令用于控制打印速度
     *  传入参数说明
     * 1<=level<=5
     * 实际支持速度以自检页为准
     */
    jpPrinter.setSpeed = function(level) {
      data = "SPEED " + level + "\r\n";
      jpPrinter.addCommand(data)
    };
    /**
     * 该指令用于打印出存储于影像缓冲区内的数据
     */
    jpPrinter.setPagePrint = function() { 
      data = "PRINT 1,1\r\n"
      jpPrinter.addCommand(data)
    };
    /**
     * 该指令用于指示打印机让蜂鸣器发出给定时间长度的声音
     * 传入参数说明
     * length        蜂鸣持续时间，以1/8秒为单位递增
     */
    jpPrinter.setSound = function(length) { //控制蜂鸣器
      data = "BEEP " + length + "\r\n";
      jpPrinter.addCommand(data)
    };
    /**
     * 该指令用于绘制线条
     * 传入参数说明
     * x0 起始点的X 坐标，单位dots
     * y0 起始点的Y 坐标，单位dots
     * x1 终止点的X 坐标，单位dots
     * y1 终止点的Y 坐标，单位dots
     * width  线宽，单位dots
     * height 线高，单位dots
     */
    jpPrinter.line = function(x0, y0, x1, y1, width) { //绘制线条
      data = "LINE " + x0 + " " + y0 + " " + x1 + " " + y1 + " "+ width + "\r\n"
      jpPrinter.addCommand(data)
    };
     /**
     * 该指令用于反色绘制线条
     * 传入参数说明
     * x0 起始点的X 坐标，单位dots
     * y0 起始点的Y 坐标，单位dots
     * x1 终止点的X 坐标，单位dots
     * y1 同y0
     * width  反色区域高度，单位dots
     */
    jpPrinter.Inverseline = function(x0, y0, x1, y1, width) { //反色绘制线条
      data = "INVERSE-LINE " + x0 + " " + y0 + " " + x1 + " " + y1 + " "+ width + "\r\n"
      jpPrinter.addCommand(data)
    };
    /**
     * 该指令用于绘制矩形方框
     * x_start 方框左上角X 坐标，单位dots
     * y_start 方框左上角Y 坐标，单位dots
     * x_end 方框右下角X 坐标，单位dots
     * y_end 方框右下角Y 坐标，单位dots
     * width 方框线宽，单位dots
     */
    jpPrinter.setBox = function (x_start, y_start, x_end, y_end, width) {
      data = "BOX " + x_start + " " + y_start + " " + x_end + " " + y_end + " " + width + "\r\n";
      jpPrinter.addCommand(data)
    };
    /**
    * 该指令用来画一维条码
    * 传入参数说明
    * command 表示条码的旋转角度
    * type 表示条码类型
    * width 表示窄条的单位宽度，以点（dot）表示
    * ratio 条码的宽窄比
    * height 条码的单位高度，以点（dot）表示
    * x 条码横向起始位置，以点（dot）表示
    * y 条码纵向起始位置，以点（dot）表示
    * data 条码数据
    */
    jpPrinter.setBarCode = function (command,type,width,ratio,height,x,y,data) {
      switch (command) {
        case 0:
          // 横向打印条码
          data = "BARCODE " + type + " " + width + " " + ratio + " " + height + " " + x + " " + y + " " + data + "\r\n"
          break;
        case 90:
          // 纵向打印条码
          data = "VBARCODE " + type + " " + width + " " + ratio + " " + height + " " + x + " " + y + " " + data + "\r\n"
          break;
      }
      jpPrinter.addCommand(data)
    };
     /**
    * 该指令用于添加一维码文本
    * 传入参数说明
    * number 表示注释条码时要使用的字体号
    * size 忽略该参数，输入任意数字即可
    * offset 文本距离条码的单位偏移量
    */
    jpPrinter.setBarCodeText = function (number,size,offset) {
      data = "BARCODE-TEXT " + number + " " + size + " " + offset + "\r\n"
      jpPrinter.addCommand(data)
    };
    /**
     * 打印图片（单色图片）
     * x 位图的横向起始位置
     * y 位图的纵向起始位置
     * res为画布参数
     */
    jpPrinter.setBitmap = function (x, y, res) {
      console.log(res)
      var w = res.width;
      var h = res.height;
      var bitw = parseInt((w + 7) / 8) * 8;
      // var bitw = (parseInt(w) % 8) == 0 ? (parseInt(w) / 8) :( parseInt(w) / 8+1);
      var pitch = parseInt(bitw / 8);
      var bits = new Uint8Array(h * pitch);
      console.log("w=" + w + ", h=" + h + ", bitw=" + bitw + ", pitch=" + pitch + ", bits=" + bits.length);
      var cmd = "CG " + pitch + " " + h + " " + x +" " + y + " " ;
      console.log("add cmd: " + cmd);
      jpPrinter.addCommand(cmd);
      // for (var i=0; i<bits.length; i++) {
      //   bits[i] = 0;
      // }
      for (y = 0; y < h; y++) {
        for (x = 0; x < w; x++) {
          var color = res.data[(y * w + x) * 4 + 1];
          if (color <= 128) {
            bits[parseInt(y * pitch + x / 8)] |= (0x80 >> (x % 8));
          }
        }
      }
      for (var i = 0; i < bits.length; i++) {
        command.push((bits[i]) & 0xFF);
      }
      console.log(command);
    };

    /**
     * 该指令用于打印字符串
     * 传入参数说明
     * command 表示文本的旋转角度
     * font 字体名称
     * x 文字X 方向起始点坐标
     * y 文字Y 方向起始点坐标
     * data 要打印的文本
     */
    jpPrinter.setText = function(command,font, size,x, y,data) { 
      switch (command) {
        case 0:
          // 横向打印文本
          data = "TEXT " + font + " " + size + " " + x + " " + y +" " + data  +"\r\n";
          break;
        case 90:
          // 逆时针旋转90度，纵向打印文本
          data = "TEXT90 " + font + " " + size + " " + x + " " + y +" " + data  +"\r\n";
          break;
        case 180:
          // 逆时针旋转180度，反转打印文本
          data = "TEXT180 " + font + " " + size + " " + x + " " + y +" " + data  +"\r\n";
          break;
          case 270:
            // 逆时针旋转270度，纵向打印文本
            data = "TEXT270 " + font + " " + size + " " + x + " " + y +" " + data  +"\r\n";
            break;
        default:
          console.log('无此旋转角度');
          return;
      }
      jpPrinter.addCommand(data)
    };

 /**
     * 该指令用于将字体放大指定倍数
     * 传入参数说明
     * w 宽度放大倍数，有效放大倍数为1-10
     * h 高度放大倍数，有效放大倍数为1-10
     */
    jpPrinter.setTmag = function(w,h) { 
      data = "SETMAG "  + w +" "+ h +"\r\n"
      jpPrinter.addCommand(data)
    };
   /**
     * 该指令用于对字体加粗
     * 传入参数说明
     * value 为0时不加粗
     */
    jpPrinter.setBlod = function(value) { 
      data = "SETBOLD "  + value +"\r\n"
      jpPrinter.addCommand(data)
    };
     /**
     * 该指令用于选择对齐方式
     * 传入参数说明
     * value 为1时居中对齐 2左对齐 3右对齐
     * end 对齐的结束点
     */
    jpPrinter.align = function(value,end) {
      switch (value) {
        case 1:
          // 设置居中对齐的指令
          data = "CENTER "+ end +"\r\n";
          break;
        case 2:
          // 设置左对齐的指令
          data = "LEFT "+ end +"\r\n";
          break;
        case 3:
          // 设置右对齐的指令
          data = "RIGHT "+ end +"\r\n";
          break;
        default:
          console.log('无效的对齐方式');
          return;
      }
      jpPrinter.addCommand(data);
    };
    /**
     * 该指令用来打印二维码
     * type QR
     * ｘ 二维码水平方向起始点坐标
     * ｙ 二维码垂直方向起始点坐标
     * M a 二维码的规范编号，1或2，推荐2
     * U b 模块的单位宽度/单位高度 范围为1-32 默认为6
     * text  内容
     */
    jpPrinter.setQrcode = function(x,y,M,a,U,b,text) {
      data = "B " + "QR "+ x +" "+ y + " " +  M  + " " +  a  + " " +  U + " " + b + "\r\n" + text + "\r\n" + "ENDQR "+"\r\n"
      jpPrinter.addCommand(data)
    };
    //获取打印数据
    jpPrinter.getData = function() {
      return command;
    };　　
    return jpPrinter;　
  }
};

module.exports.jpPrinter = jpPrinter;